import { defineStore } from 'pinia';
import { RouteRecordRaw } from 'vue-router';

import { RouteItem } from '@/api/model/system/permissionModel'; // 导入路由项类型定义
import { getRouters } from '@/api/system/permission'; // 导入获取菜单列表的API方法
import router, { fixedRouterList, homepageRouterList } from '@/router'; // 导入路由实例和固定路由配置
import { store } from '@/store'; // 导入基础store配置
import { transformObjectToRoute } from '@/utils/route'; // 导入路由数据转换工具

// 定义权限store
export const usePermissionStore = defineStore('permission', {
  state: () => ({
    whiteListRouters: ['/login'], // 路由白名单（不需要权限校验的路由）
    routers: [], // 存储最终生成的可访问路由表（用于菜单展示）
    removeRoutes: [], // 存储需要移除的路由（当前版本未使用）
    asyncRoutes: [], // 存储从后端获取的动态路由
  }),
  actions: {
    /**
     * 初始化路由表
     * 组合各种路由生成最终的路由表
     */
    async initRoutes() {
      const accessedRouters = this.asyncRoutes; // 获取动态路由

      // 方案1：在菜单展示全部路由（首页+动态路由+固定路由）
      // this.routers = [...accessedRouters, ...homepageRouterList, ...fixedRouterList];
      // 方案2：在菜单只展示动态路由和首页
      this.routers = [...homepageRouterList, ...accessedRouters];
      // console.log(this.routers);

      // 方案3：在菜单只展示动态路由
      // this.routers = [...accessedRouters];
    },

    /**
     * 构建动态路由
     * @returns 生成的路由表
     * @throws 当构建失败时抛出错误
     */
    async buildAsyncRoutes() {
      try {
        // 从后端API获取菜单列表
        const asyncRoutes: Array<RouteItem> = (await getRouters()).data;
        // 将API返回的路由数据转换为Vue Router可识别的格式
        this.asyncRoutes = transformObjectToRoute(asyncRoutes);
        // 初始化路由表
        await this.initRoutes();

        return this.asyncRoutes;
      } catch (error) {
        // throw new Error("Can't build routes"); // 抛出构建路由失败错误
      }
    },

    /**
     * 恢复/重置路由
     * 用于登出等场景，移除所有动态添加的路由
     */
    async restoreRoutes() {
      // 注意：不需要在此额外调用initRoutes更新侧边导航内容，
      // 因为在登录后asyncRoutes为空时会自动调用

      // 移除所有动态添加的路由
      this.asyncRoutes.forEach((item: RouteRecordRaw) => {
        if (item.name) {
          router.removeRoute(item.name); // 通过路由名移除路由
        }
      });

      // 清空动态路由
      this.asyncRoutes = [];
    },
  },
});

/**
 * 获取权限store实例的快捷方法
 * @returns 权限store实例
 */
export function getPermissionStore() {
  return usePermissionStore(store);
}
